package com.flyqiu.common.dict;

import java.util.*;
import java.util.stream.Collectors;

/**
 * FlyQiuDictTools工具类，提供字典数据处理相关的方法。
 */
public class FlyQiuDictTools {

    /**
     * 获取字典数据列表。
     *
     * @param data 字典数据列表，类型为泛型T，T需继承自Dict。
     * @return FlyQiuDicData类型的列表，包含处理后的字典数据。
     */
    public static <T extends Dict<?>> List<FlyQiuDicData> getDictData(List<T> data) {
        return getDictData(data, true);
    }

    /**
     * 获取字典数据列表，支持自动分组。
     *
     * @param data 字典数据列表，类型为泛型T，T需继承自Dict。
     * @param autoGroup 是否自动分组，true为自动分组，false则不进行分组。
     * @return FlyQiuDicData类型的列表，包含处理后的字典数据。
     */
    public static <T extends Dict<?>> List<FlyQiuDicData> getDictData(List<T> data, boolean autoGroup) {
        List<FlyQiuDicData> result = new ArrayList<>();
        // 数据校验
        if (data == null || data.isEmpty()) {
            return result;
        }

        // 数据分组及排序
        Map<String, List<T>> sortedDatas = data.stream().filter(e -> e.getGroupKey() != null)
                .sorted(Comparator.comparing(T::getGroupOrder))
                .collect(Collectors.groupingBy(T::getGroupKey, LinkedHashMap::new, Collectors.toList()));

        // 处理分组后的数据
        Collection<List<T>> values = sortedDatas.values();
        for (List<T> childen : values) {
            FlyQiuDicData flyQiuDicData = new FlyQiuDicData();
            flyQiuDicData.setLabel(childen.get(0).getGroupLabel());
            flyQiuDicData.setValue(childen.get(0).getGroupKey());
            flyQiuDicData.setGroups(childen.stream().map(FlyQiuDictTools::convert).collect(Collectors.toList()));
            result.add(flyQiuDicData);
        }

        // 处理未分组的数据
        result = data.stream().filter(e -> e.getGroupKey() == null).sorted(Comparator.comparing(T::getOrder)).map(FlyQiuDictTools::convert).collect(Collectors.toList());

        // 根据是否自动分组返回结果
        if (!autoGroup) {
            return result;
        }
        if (result.size() < 2) {
            return result.get(0).getGroups();
        }
        return result;
    }

    /**
     * 将Dict类型数据转换为FlyQiuDicData类型。
     *
     * @param data Dict类型数据。
     * @return 转换后的FlyQiuDicData类型数据。
     */
    public static <T extends Dict<?>> FlyQiuDicData convert(T data) {
        FlyQiuDicData flyQiuDicData = new FlyQiuDicData(data.getLabel(), data.getValue(), data.getExtProp());
        flyQiuDicData.setDisabled(data.isDisabled());
        flyQiuDicData.setOrder(data.getOrder());
        flyQiuDicData.setDesc(data.getDesc());
        return flyQiuDicData;
    }

}
